import os
import shutil
import re

# 定义允许的文件扩展名
ALLOWED_EXTENSIONS = {'jpg', 'jpeg', 'png', 'tif', 'tiff','gif'}
    
def sanitize_filename(filename):
    # 分离文件名和扩展名
    name, ext = os.path.splitext(filename)
    
    # 定义需要替换的字符列表，包含点（.）
    ambiguous_chars = [' ', ',', '=', '&', '"', "'", ';', ':', '/', '\\', '*', '?', '<', '>', '|', '.']
    
    # 替换文件名中的所有容易产生歧义的字符
    for char in ambiguous_chars:
        name = name.replace(char, '_')
    
    # 重新组合文件名和扩展名
    sanitized_name = name + ext
    
    return sanitized_name

def is_allowed_file_extension(file_name):
    """检查文件是否具有允许的扩展名"""
    return file_name.lower().endswith(tuple(ALLOWED_EXTENSIONS))

def copy_files_to_destination(source_dirs, destination_dir, invalid_dir):
    if not os.path.exists(destination_dir):
        os.makedirs(destination_dir)
    if not os.path.exists(invalid_dir):
        os.makedirs(invalid_dir)

    duplicate_count = 0  # 用于统计重名文件的数量
    invalid_files_count = 0  # 统计不符合条件的文件数量

    for source_dir in source_dirs:
        for root, dirs, files in os.walk(source_dir):
            for file_name in files:
                src_file_path = os.path.join(root, file_name)
                
                # 检查文件是否具有允许的扩展名
                if is_allowed_file_extension(file_name):
                    # 清理文件名
                    clean_file_name = sanitize_filename(file_name)
                    dest_file_path = os.path.join(destination_dir, clean_file_name)

                    original_dest_file_path = dest_file_path  # 保存原始的目标路径以供比较
                    counter = 1
                    while os.path.exists(dest_file_path):
                        name, ext = os.path.splitext(clean_file_name)
                        new_file_name = f"{name}-{counter}{ext}"
                        dest_file_path = os.path.join(destination_dir, new_file_name)
                        counter += 1

                    # 如果文件路径发生了变化，则说明遇到了重名文件
                    if dest_file_path != original_dest_file_path:
                        duplicate_count += 1

                    # 复制文件到目标位置
                    shutil.copy2(src_file_path, dest_file_path)  # 使用copy2以保留元数据
                    print(f"Copied: {src_file_path} -> {dest_file_path}")
                else:
                    # 将不符合条件的文件移动到无效文件目录
                    invalid_dest_file_path = os.path.join(invalid_dir, file_name)
                    shutil.move(src_file_path, invalid_dest_file_path)
                    print(f"Moved to invalid directory: {src_file_path} -> {invalid_dest_file_path}")
                    invalid_files_count += 1

    print(f"重名文件的数量: {duplicate_count}")
    print(f"无效文件的数量: {invalid_files_count}")

# 示例用法
source_directories = ['D:\\北京伊吕科技\\应用场景\\数据标注\\深启科技\\yw\\sld']  # 替换为你要汇总的目录路径
destination_directory = r'd:\temp'  # 注意这里使用原始字符串（r''）避免转义字符问题
invalid_directory = r'd:\invalidFile'

copy_files_to_destination(source_directories, destination_directory, invalid_directory)
